#include <stdio.h>
#include <stdlib.h>

typedef int ElemSet; /* 默认元素为整数*/
#define Swap(x, y) { ElemSet t = x; x = y; y = t; }

/* 堆的定义与操作 */
typedef ElemSet HElemSet;
typedef int Position; /* 数组下标即为元素位置 */
typedef struct BinaryHeapNode *MaxHeap;
struct BinaryHeapNode {
    HElemSet *data; /* 数据元素数组 */
    int size; /* 规模 */
    int capacity; /* 容量 */
};

void SiftDown(MaxHeap h, Position i) {
    Position last, child;
    HElemSet elem;

    last = h->size - 1; /* 这是最后一个元素的位置 */
    elem = h->data[i];
    while (1) {
        child = (i << 1) + 1; /* child当前是i的左孩子的位置 */
        if (child < last
                && h->data[child + 1] > h->data[child]) { /* 如果i有右孩子并且右孩子更大 */
            child++; /* child更新为i的右孩子的位置 */
        } else if (child > last) { /* 如果i是叶子结点 */
            break; /* 已经调整到底，跳出循环 */
        }
        if (elem < h->data[child]) { /* 若较大的孩子比elem大 */
            h->data[i] = h->data[child]; /* 将较大的孩子结点上移 */
            i = child; /* i指向原结点的孩子结点，即向下调整 */
        } else { /* 若所有孩子都不比elem大 */
            break; /* 则找到了elem的最终位置，跳出循环 */
        }
    }
    h->data[i] = elem;
}

void MakeHeapDown(MaxHeap h) {
    Position last;
    int i;

    last = h->size - 1; /* 这是最后一个元素的位置 */
    for (i = (last - 1) >> 1; i >= 0; i--) {
        SiftDown(h, i); /* 自底向上调整 */
    }
}
/* 堆的定义与操作结束 */

/* 算法10-4：堆排序 HeapSort(a,l,r) */
void HeapSort(ElemSet *a, int l, int r) {
    MaxHeap h;

    h = (MaxHeap)malloc(sizeof(struct BinaryHeapNode));
    h->capacity = h->size = r - l + 1;
    h->data = a + l;
    MakeHeapDown(h); /* 建最大堆 */
    while (h->size > 1) { /* 基于堆的排序 */
        Swap(h->data[0], h->data[h->size - 1]);
        h->size--;
        SiftDown(h, 0);
    }
    free(h);
}
/* 算法10-4 结束 */

int main(void) {
    ElemSet *a; /* 数组a的下标从0开始 */
    int n, i;

    scanf("%d", &n);
    a = (ElemSet *)malloc(sizeof(ElemSet) * n);
    for (i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }
    HeapSort(a, 0, n - 1);
    for (i = 0; i < n; i++) {
        printf("%d ", a[i]);
    }

    return 0;
}